{***************************************************************
    SpyGestion  Copyright (C) 2008 Christophe KOALI <nature2gas@gmail.com>
    
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
    
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
    
****************************************************************}
unit modInteractionFichierUpdate;

interface

uses Classes;


type


(***************************************************************
 Structure d'un fichier mirroir:
 [general]
 version=1
 date=720078
 robotupdate=http://
 forum=http://xxx

 
 [news]
 http://liste d'url mirroir pour les news
 http://url2

 [mails]
 messagerie pas operationnelle


 ATTENTION: Les fichiers updates sont des fichiers mirroirs
 **)

    TFichierUpdateParsing = class(TObject)
    private
        // Liste des url pour les news
        FURLNews: TStringList;

        FURLMessagerie: TStringList;


        // Date de creation du fichier
        FGenDate: int64;


        // Version du fichier update
        FVersion: integer;

        // URL de vérification d'auth par la méthode forte
        FForumAuthLink: string;


        // adresse de la nouvelle version du robot (jamais utilisé normalement)
        // utilisé dans des cas extrême
        FNouvelleVersion: string;
        FForumURL       : string;


        // message pour l'utilisateur si jamais le système de news est vraiment mort...
        FMsgToUser: string;

        procedure TraitementLigneGeneral(Ligne: string);
    public
        // index de l'url utilisé dans la liste des URL update prédéfinit
        // pour télécharger le fichier actuel
        IdUpdateFile: integer;



        property URLNews        : TStringList read FURLNews;
        property URLMessagerie  : TStringList read FURLMessagerie;

        property MsgToUser      : string   read FMsgToUser;

        property GenDate        : int64    read FGenDate;
        property Version        : integer  read FVersion;
        property NouvelleVersion: string   read FNouvelleVersion;

        property ForumURL       : string   read FForumURL;
        property URLForumCheckAuth: string    read FForumAuthLink;

        function Parsing(Tampon: string): boolean;


        constructor Create;
        destructor Destroy; override;
    end;

   function ifuIsValidURL(URL: string): boolean;


implementation

uses sFonctionsChaines,
     SysUtils;


const
   CNT_UPDATEFILE_SECTION_GENERAL = 'general';
   CNT_UPDATEFILE_SECTION_NEWS    = 'news';
   CNT_UPDATEFILE_SECTION_MESSAGERIE = 'mails';

   CNT_UPDATEFILE_GENERAL_VERSION = 'version';
   CNT_UPDATEFILE_GENERAL_DATE = 'date';
   CNT_UPDATEFILE_GENERAL_NEWVERSIONURL = 'newversionurl';
   CNT_UPDATEFILE_GENERAL_MESSAGE = 'msg';
   CNT_UPDATEFILE_GENERAL_FORUM = 'forum';
   CNT_UPDATEFILE_GENERAL_FORUM_AUTH = 'forumauth';



procedure TFichierUpdateParsing.TraitementLigneGeneral(Ligne: string);
var Key : string;
    xPos: integer;
begin

    xPos := pos('=', Ligne);
    if xPos < 2 then exit;

    Key := copy(Ligne, 1, xPos - 1);
    System.Delete(Ligne, 1, xPos);

    Ligne := trim(Ligne);

    if SameText(Key, CNT_UPDATEFILE_GENERAL_VERSION) then begin
       FVersion := StrToIntDef(Ligne, -1);

    end else if SameText(Key, CNT_UPDATEFILE_GENERAL_DATE) then begin
       try
          FGenDate := StrToInt(Ligne);
       except
          FGenDate := 0;
       end;

    end else if SameText(Key, CNT_UPDATEFILE_GENERAL_NEWVERSIONURL) then begin
       if ifuIsValidURL(Ligne) then
          FNouvelleVersion := Ligne;


    end else if SameText(Key, CNT_UPDATEFILE_GENERAL_FORUM) then begin
       if ifuIsValidURL(Ligne) then
          FForumURL := Ligne;


    end else if SameText(Key, CNT_UPDATEFILE_GENERAL_FORUM_AUTH) then begin
                
       if ifuIsValidURL(Ligne) then
          FForumAuthLink := Ligne;



    end else if SameText(Key, CNT_UPDATEFILE_GENERAL_MESSAGE) then begin
        FMsgToUser := Ligne;
    end;




end;

function TFichierUpdateParsing.Parsing(Tampon: string): boolean;
type TSectionUpdate = (supNone, supGeneral, supNews, supMessagerie);
var Ligne: string;
    xPos: integer;
    sWhere: TSectionUpdate;
begin


    sWhere := supNone;
    Tampon := trim(sfcRemplace(Tampon, #$0D, ''));

    while Tampon <> '' do begin

        xPos := pos(#$0A, Tampon);
        if xPos = 0 then begin
           Ligne := Tampon;
           Tampon := '';
        end else begin
           Ligne := copy(Tampon, 1, xPos - 1);
           System.Delete(Tampon, 1, xPos);
        end;

        Ligne := trim(Ligne);
        Tampon := trimleft(Tampon);

        if Ligne = '' then Continue;
        if Ligne[1] = '#' then Continue;
        if Ligne[1] = '/' then Continue;
        if Ligne[1] = ';' then Continue;

        if Ligne[1] = '[' then begin
            // debut de section
            System.Delete(Ligne, 1, 1);
            xPos := pos(']', Ligne);
            if xPos = 0 then Continue;

            System.Delete(Ligne, xPos, maxint);

            if SameText(Ligne, CNT_UPDATEFILE_SECTION_GENERAL) then begin
               sWhere := supGeneral;

            end else if SameText(Ligne, CNT_UPDATEFILE_SECTION_NEWS) then begin
               sWhere := supNews;

            end else if SameText(Ligne, CNT_UPDATEFILE_SECTION_MESSAGERIE) then begin
               sWhere := supMessagerie;

            end;

            Continue;
        end;

        case sWhere of
             supGeneral: TraitementLigneGeneral(Ligne);
             supNews:       if ifuIsValidURL(Ligne) then FURLNews.Add(Ligne);
             supMessagerie: if ifuIsValidURL(Ligne) then URLMessagerie.Add(Ligne);
        end;

    end;


end;

constructor TFichierUpdateParsing.Create;
begin
    inherited Create;

        FURLNews      := TStringList.Create;

        FURLMessagerie:= TStringList.Create;

        FGenDate := 0;
        FVersion := 0;
        FNouvelleVersion := '';
        FMsgToUser := '';
        FForumURL := '';

        FForumAuthLink := '';


end;

destructor TFichierUpdateParsing.Destroy;
begin
    FURLNews.Free;
    FURLMessagerie.Free;

    inherited Destroy;
end;

function ifuIsValidURL(URL: string): boolean;
begin
    Result := false;

    if length(URL) < 11 then exit;

    URL := lowercase(URL);

    if SameText(copy(URL, 1, 7), 'http://') = false then begin
       exit;
    end;
    if pos(' ', URl) > 0 then begin
       // les espaces doivent être des %20
       exit;
    end;

    Result := true;

end;


end.
